;^Z80^
TITLE FILE: DDP_MANAG:TOS HEWLETT-PACKARD: DDP_MANAGER (c) Coleco 1983 Confidential
;NAME ^Rev 01 - DTT^
De_DDP_MANAGER MACRO ;Header Rev. 5
.GOTO Ede_DDP_MANAGER
Project: H132, VS
******************************
* *
* DDP_MANAGER DTT *
* *
******************************
Rev History
Rev. Date Name Change
1 DTT DEVICE_ID --> DEV_ID
0 9/9/83 DTT Initial Pseudo Code
Function:
CONTROLS THE DIGITAL DATA PACK FOR READS AND WRITES SETUP BY TAPE_INTERFACE
Ede_DDP_MANAGER MEND
Pseudo_code_DDP_MANAGER MACRO ;Pseudocode macro area
.GOTO Ep_DDP_MANAGER
Ep_DDP_MANAGER MEND
;Inputs/Outputs passed in registers
; CALLED EVERY 60th SECOND BY THE NMI
TAPE1 EQU 08H
READ_TAPE EQU 81H
WRITE_TAPE EQU 82H
KILL_TAPE EQU 87H
INCLUDE P_DCB_EQ.ASM ;INCLUDE P_DCB_EQU:EOS
INCLUDE EOS_ERRS.ASM ;INCLUDE EOS_ERRS:EOS
;*EXTERNAL DATA AREAS USED:
EXT _START_RD_1_BLOCK
EXT _FIND_DCB
EXT _START_WR_1_BLOCK
EXT _END_RD_1_BLOCK
NEXT_STATE MACRO LP1
LD A,LP1 ;SOMETHING IN THE COMMAND BUFFER!
LD [D_TAPE_STATE],A
LD HL,[STATE_VECTORS+LP1+LP1]
LD [NEXT_STATE_ADDRESS],HL
JP END_OF_STATE_MACHINE
MEND
GLOBAL DEV_ID
GLOBAL INITIALIZE_DDP,INITIALIZE_TAPE,INIT_TAPE,INIT_DDP
INITIALIZE_DDP:
INITIALIZE_TAPE:
INIT_TAPE:
INIT_DDP:
INIT_CODE:
XOR A
LD (D_CSA),A
LD (D_TAPE_STATE),A
DEC A
LD (D_OVERLAY_NUMBER),A
LD HL,(STATE_VECTORS+0000) ;IDLE STATE
LD (NEXT_STATE_ADDRESS),HL
RET
STATE_VECTORS:
DEFW STATE_IDLE ;STATE 0
DEFW STATE_1 ; 1 REQUEST FOR I/O FOR 1 BLOCK
DEFW STATE_2 ; 2 TEST FOR COMPLETE AND REQUEST STATUS
DEFW STATE_3 ; 3 TEST STATUS
LEN_INIT EQU $-INIT_CODE
;*
;*
DEFS 1BH-LEN_INIT ;MAKE SURE THE MANAGER VECTOR IS AT THE SAME LOC AS THE S/IO_MANAGER
GLOBAL DDP_MANAGER
GLOBAL TAPE_MANAGER
TAPE_MANAGER:
DDP_MANAGER:
;* BEGIN (Ordinarily registers are restored; retain only the pushes and pops you need.)
;*
;*
;*
;* FALL THRU TO CASE STATEMENT ;IF STATE = 6,7
;* ;FILE IS TRYING TO CLOSE
;*
;*
;* CASE D_TAPE_STATE,(IDLE,STATE_1,STATE_2,STATE_3,INIT_DDP)
;*
CASE_STATE:
;*
;*
LD HL,[NEXT_STATE_ADDRESS]
JP [HL]
;*
;* IF THE MACHINE IS IDLE IT'S OK TO TEST FOR ANOTHER I/O REQUEST
;*
STATE_IDLE: ;STATE 0
LD A,[D_CSA] ;TEST THE COMMAND STATUS AREA
OR A
JP P,END_OF_STATE_MACHINE ;IF THE CSA CONTAINS AN ERROR CODE DON't PROCESS IT
;*
;* FALL THROUGH TO STATE 1
;*
STATE_1:
AB_REQ: LD A,(D_CSA) ;IF COMMAND IS TO KILL DDP COMMAND
CP KILL_TAPE
JP Z,INIT_DDP
;*
;* REQUEST TO WRITE/READ A RECORD
;*
LD HL,(XFER_ADDR)
LD DE,(BLOCK_NUM)
LD BC,0000H
LD A,(D_CSA)
CP READ_TAPE
LD A,(DEV_ID)
JR NZ,EOS_TAPE_WRITE
EOS_TAPE_READ:
CALL _START_RD_1_BLOCK
JR RET_ADDR
EOS_TAPE_WRITE:
CALL _START_WR_1_BLOCK
RET_ADDR:
NEXT_STATE 2
;*
;* TEST FOR ACCEPTANCE/COMPLETION OF I/O REQUEST
;*
STATE_2:
LD A,(DEV_ID) ;TEST THE STATUS OF THE FILE
CALL _END_RD_1_BLOCK
JP NC,END_OF_STATE_MACHINE ;BETTER RETRY STATE 2
;*
;* AT THIS POINT THE COMMAND HAS BEEN ACCEPTED BY THE NETWORK
;* IF THE ZERO FLAG IS NOT SET THERE HAVE BEEN ERRORS (09BH=TIMEOUT)
;*
JR NZ,STATE_1 ;BETTER RETRY STATE 1
;*
;* IF NO ERRORS THEN SET UP REQUEST STATUS OF THE TAPE DRIVE
;* THIS TESTS THE CHECK SUM (CRC) OF THE DATA XMITTED BY THE TAPE
;*
STATE_2_OK:
;*
LD A,(DEV_ID) ;STATUS COMMAND
CALL _FIND_DCB
LD (IY+D_COM_STAT),DCB_STATUS
NEXT_STATE 3
;*
;* IN STATE 3 TEST FOR ACCEPTANCE OF THE REQUEST FOR STATUS COMMAND
;*
STATE_3:
LD A,(DEV_ID)
CALL _FIND_DCB ;WAS THE STATUS REQUEST ACKNOWLEDGED????
BIT CMND_COMPLETE_BIT,(IY+D_COM_STAT)
JP Z,END_OF_STATE_MACHINE
;*
;* IF THE COMMAND IS NOT YET ACCEPTED, COME BACK TO STATE 3 NEXT PASS
;*
LD A,(IY+D_COM_STAT) ;STATUS COMMAND ACCEPTED
CP 080H
JR NZ,STATE_2_OK ;COULD NOT GET STATUS?
;*
;*
;*
;SAVE THE STATUS IN REGISTER B
LD A,(DEV_ID) ;CHECK FOR SECONDARY DEVICE ID
AND 0F0H
LD A,(IY+D_STATUS_FLAGS)
JR Z,DEV_0_CHECK ;SECONDARY_DEV_ID=0
RR A ;GET STATUS INTO THE LOW NIBBLE
RR A
RR A
RR A
DEV_0_CHECK:
AND 0FH
JP NZ,ERROR ;A BAD STATUS
;*
;* IF THE COMMAND IS ACCEPTED AND THERE ARE NO ERRORS INCREMENT THE CSA DATA
;*
LD HL,(XFER_ADDR) ; A BLOCK HAS BEEN WRITTEN OR READ
LD DE,(BLOCK_NUM) ;UPDATE THE D_CSA AREA!
LD BC,0400H
LD A,(RANGE)
DEC A
JP Z,INIT_DDP ;DONE WITH OVERLAY?
;*
;* IF THE RANGE WAS DECREMENTED TO ZERO WE ARE DONE ELSE (WE ARE NOT?)
;*
LD (RANGE),A
INC DE
LD (BLOCK_NUM),DE
ADD HL,BC
LD (XFER_ADDR),HL
JP STATE_1
;*
;* ERROR PROCESSING FROM REQUEST STATUS
;*
ERROR:
;* Errors occur after request status
;* Possible errors are 1=CRC error (bad data on tape)
;* 2=block not found 3=no tape in drive 4=no drive
;* The user program is expected to test for errors via
;* TEST_TAPE in the TAPE_INTERFACE module.
;*
;*
LD (D_CSA),A ;SAVE THE ERROR CODE IN THE CSA
LD HL,(STATE_VECTORS+0) ;NEXT STATE = IDLE
LD (NEXT_STATE_ADDRESS),HL
;* END (DDP_MANAGER)
END_OF_STATE_MACHINE:
XOR A
RET
;************************************************************************
;***** DEV_ID IS DEFAULT 08 FOR TAPE DRIVE 0 *****
;************************************************************************
DEV_ID DEFB TAPE1
;************************************************************************
;************************************************************************
;************************************************************************
GLOBAL D_OVERLAY_NUMBER
GLOBAL D_TAPE_STATE
GLOBAL D_CSA
;*--------------------------------------------------------------
;*THE NEXT_STATE_ADDRESS MAY BE PUT IN DATA,PROG,OR COMN (IT'S ALL RAM TO ADAM)
;*
NEXT_STATE_ADDRESS DEFS 2
;*--------------------------------------------------------------
;* BY MAKING THE CSA COMMON IT IS EASILY LINKED
;* INTO EXISTING CODE
DATA
D_OVERLAY_NUMBER DEFS 1
D_TAPE_STATE DEFS 1
D_CSA DEFS 6
XFER_ADDR EQU D_CSA+1
BLOCK_NUM EQU XFER_ADDR+2
RANGE EQU BLOCK_NUM+2